/* Copyright (C) 2004 The Trustees of Indiana University. All rights reserved.
 * 
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions are met:
 * 
 * 1) All redistributions of source code must retain the above copyright notice,
 * the list of authors in the original source code, this list of conditions and
 * the disclaimer listed in this license;
 * 
 * 2) All redistributions in binary form must reproduce the above copyright
 * notice, this list of conditions and the disclaimer listed in this license in
 * the documentation and/or other materials provided with the distribution;
 * 
 * 3) Any documentation included with all redistributions must include the
 * following acknowledgement:
 * 
 * "This product includes software developed by the Indiana University Extreme!
 * Lab. For further information please visit http://www.extreme.indiana.edu/"
 * 
 * Alternatively, this acknowledgment may appear in the software itself, and
 * wherever such third-party acknowledgments normally appear.
 * 
 * 4) The name "Indiana University" or "Indiana University Extreme! Lab" shall
 * not be used to endorse or promote products derived from this software without
 * prior written permission from Indiana University. For written permission,
 * please contact http://www.extreme.indiana.edu/.
 * 
 * 5) Products derived from this software may not use "Indiana University" name
 * nor may "Indiana University" appear in their name, without prior written
 * permission of the Indiana University.
 * 
 * Indiana University provides no reassurances that the source code provided
 * does not infringe the patent or any other intellectual property rights of any
 * other entity. Indiana University disclaims any liability to any recipient for
 * claims brought by any other entity based on infringement of intellectual
 * property rights or otherwise.
 * 
 * LICENSEE UNDERSTANDS THAT SOFTWARE IS PROVIDED "AS IS" FOR WHICH NO
 * WARRANTIES AS TO CAPABILITIES OR ACCURACY ARE MADE. INDIANA UNIVERSITY GIVES
 * NO WARRANTIES AND MAKES NO REPRESENTATION THAT SOFTWARE IS FREE OF
 * INFRINGEMENT OF THIRD PARTY PATENT, COPYRIGHT, OR OTHER PROPRIETARY RIGHTS.
 * INDIANA UNIVERSITY MAKES NO WARRANTIES THAT SOFTWARE IS FREE FROM "BUGS",
 * "VIRUSES", "TROJAN HORSES", "TRAP DOORS", "WORMS", OR OTHER HARMFUL CODE.
 * LICENSEE ASSUMES THE ENTIRE RISK AS TO THE PERFORMANCE OF SOFTWARE AND/OR
 * ASSOCIATED MATERIALS, AND TO THE PERFORMANCE AND VALIDITY OF INFORMATION
 * GENERATED USING SOFTWARE.
 */

package edu.indiana.cs.b534.torrent.context;

import edu.indiana.cs.b534.torrent.TorrentException;

import java.util.Collection;
import java.util.List;
import java.util.Vector;

/**
 * @author : Eran Chinthaka (echintha@cs.indiana.edu)
 * @Date : Mar 13, 2007
 */
public class PeerDescription {
    private final String peerId;
    private List<Integer> piecesList;
    boolean isChoked = true;
    boolean sentInterested = false;
    private long timeLastRequestOrInterstedSent = -1;
    private int currentDownloadingPiece = -1;
    //TODO
    private int retryCout = 1;
    

    public PeerDescription(String peerId) throws TorrentException {
    	if(peerId == null){
    		throw new TorrentException("Peer ID must not be Null");
    	}
		this.peerId = peerId;
        this.piecesList = new Vector<Integer>();
    }

	public String getPeerId() {
        return peerId;
    }


    public Collection<Integer> getPiecesList() {
        return piecesList;
    }

    public void addPiece(int piece){
    	piecesList.add(piece);
    }
    
    public boolean isChoked() {
        return isChoked;
    }

    public synchronized  void setChoked(boolean choked) {
        isChoked = choked;
    }

    public boolean isSentInterested() {
        return sentInterested;
    }

    public synchronized  void setSentInterested(boolean sentInterested) {
        this.sentInterested = sentInterested;
    }


    public String toString() {
        return peerId;
    }

	public int getCurrentDownloadingPiece() {
		return currentDownloadingPiece;
	}

	public synchronized void setCurrentDownloadingPiece(int currentDownloadingPiece) {
		this.currentDownloadingPiece = currentDownloadingPiece;
		retryCout = 0;
	}

	public long getTimeLastRequestOrInterstedSent() {
		return timeLastRequestOrInterstedSent;
	}

	public synchronized void setTimeLastRequestOrInterstedSent(
			long timeLastRequestOrInterstedSent) {
		this.timeLastRequestOrInterstedSent = timeLastRequestOrInterstedSent;
	}

	public int getRetryCout() {
		return retryCout;
	}
	
	public synchronized void incrementRetryCount(){
		retryCout++;
	}
	
	
	
}
